#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
  char* myargv[] = { "ls", "-a", "-l", NULL };
  execv("/usr/bin/ls", myargv);
  return 0;
}
//int main()
//{
//  printf("开始进行程序替换.....\n");
//  sleep(1);
//  execlp("ls","ls","-a","-l",NULL);
//  printf("替换成功\n");//测试用，一般来说如果替换成功了，是不可能执行这句语句的
//  return 0;
//}
////int main()
//{
//  printf("开始进行程序替换.....\n");
//  sleep(1);
//  execl("/usr/bin/ls","ls","-a","-l",NULL);
//  printf("替换成功\n");//测试用，一般来说如果替换成功了，是不可能执行这句语句的
//  return 0;
//}
//
//int main()
//{
//  pid_t pid=fork();
//  if(pid==-1){
//    perror("fork");
//    exit(-1);
//  }
//  if(pid==0){
//    //子进程
//    int cnt=5;
//    while(cnt--){
//      printf("我是子进程,我的pid:%d,我的ppid:%d\n",getpid(),getppid());
//      sleep(1);
//    }
//    exit(1);
//  }
//  //父进程
//  int status;
//  while(1){
//       int ret=waitpid(pid,&status,WNOHANG);//非阻塞等待
//      if(ret==-1){
//          perror("wait");
//          return 1;
//      }else if(ret==0){
//          printf("非阻塞等待中.....正在执行其他任务.......\n");
//          sleep(1);
//      }else {
//          printf("wait success,exitSignal:%d exitCode:%d\n",status & 0x7F,(status >>8)& 0xFF);
//          break;
//      }
//  }
//  return 0;
//}
////int main()
//{
//  pid_t pid=fork();
//  if(pid==-1){
//    perror("fork");
//    exit(-1);
//  }
//  if(pid==0){
//    //子进程
//    int cnt=5;
//    while(cnt--){
//      printf("我是子进程,我的pid:%d,我的ppid:%d\n",getpid(),getppid());
//      sleep(1);
//    }
//    exit(1);
//  }
//  //父进程
//  int status;
//  int ret=waitpid(pid,&status,0);//阻塞等待
//  if(ret==-1){
//      perror("wait");
//      return 1;
//  }else{
//      printf("wait success,exitSignal:%d exitCode:%d\n",status & 0x7F,(status >>8)& 0xFF);
//  }
//
//  return 0;
//}

//int main()
//{
//  pid_t pid=fork();
//  if(pid==-1){
//    perror("fork");
//    exit(1);
//  }else if(pid==0){
//      //子进程
//      int cnt=5;
//      while(cnt--){
//        printf("我是子进程，我的pid是:%d,我的ppid是%d\n",getpid(),getppid());
//        sleep(1);
//      }
//      exit(2);
//  }else{
//      //父进程
//      int status;
//      int ret=wait(&status);
//      if(ret==-1){
//        perror("wait");
//        exit(3);
//      }else{
//        int exitSignal=status & 0x7F;//退出信号
//        int exitCode=(status >>8) & 0xFF; //退出码
//        printf("exitSignal:%d exitCode:%d \n",exitSignal,exitCode);
//      }
//  }
//  return 0;
//}
//
//void Print()
//{
//  printf("hello world");
//  _exit(1);
//}
//
//int main()
//{
//  Print();
//  return 0;
//}
//
//int g_val=0;
//
//int main(){
//    pid_t id = fork();
//    if(id < 0){
//        perror("fork");
//        return 0;
//    }else if(id == 0){ 
//        //子进程
//        g_val=100;
//        //现在这个场景子进程肯定先跑完，也就是子进程先修改，完成之后，父进程再读取
//        printf("child[%d]: %d : %p\n", getpid(), g_val, &g_val);
//	}else{ 
//        //父进程
//        printf("parent[%d]: %d : %p\n", getpid(), g_val, &g_val);
//	}
//  //_exit(-1);
//	return 0;
//}
//int main()
//{
//  int pid=fork();
//  if(pid<0){
//    perror("fork");
//    return 0;
//  }else if(pid==0){
//    //子进程
//    printf("child[%d]: %d : %p\n", getpid(), g_val, &g_val);
//  }else{
//    //父进程
//    printf("parent[%d]: %d : %p\n", getpid(), g_val, &g_val);
//  }
//
//  return 0;
//}
//
//int main()
//{
//  char* env=getenv("MYTEST");
//  if(env){
//    printf("%s\n",env);
//  }else{
//    printf("no env\n");
//  }
//  int pid=fork();
//  if(pid==0)
//  {
//    printf("子进程:%s\n",getenv("MYCHAR"));
//  }
//  return 0;
//}
//
//
//int main()
//{
//  printf("%s\n",getenv("HOME"));
//  return 0;
//}
//
//int main(int argc,char*argv[],char* env[])
//{
//  for(int i=0;env[i];++i)
//  {
//    printf("%s\n",env[i]);
//  }
//  return 0;
//}
//
//int main(){
//  extern char** environ;
//  for(int i=0;environ[i];++i){
//    printf("%s\n",environ[i]);
//  }
//  return 0;
//}
